home *** CD-ROM | disk | FTP | other *** search
/ Fritz: All Fritz / All Fritz.zip / All Fritz / FILES / PROGBLER / WHIZZARD.LZH / YREP.ASM < prev    next >
Assembly Source File  |  1984-07-12  |  7KB  |  275 lines

  1. COMMENT *
  2.                  CLUBware  (tm)
  3.  
  4.       YREP repeates an input character some number of times.
  5.           The string starts at the current cursor position
  6.           and proceeds down the screen in a vertical column.
  7.           The cursor position is updated to just after the
  8.           string when complete.
  9.  
  10.            Copyright 1984 Rayhawk Automation N.W. Inc
  11.                   P.O. Box 1427
  12.                   Beaverton, Oregon   97075
  13.  
  14.  
  15.       Algorithm:
  16.           1) load type of crt display from 0000:463
  17.           2) load current position from 0000:0450
  18.           3) load count of characters to write
  19.           4) load character to write
  20.           4a) load attribute for character
  21.           5) address the screen segment
  22.           6) move string to screen segment while synchronizing
  23.               with horizontal retrace
  24.           7) update cursor position
  25.  
  26.  
  27.       CALL    YREP ( FLAG% , CHARACTER$ , COUNT% , ATTRIBUTE% )
  28.  
  29.           FLAG%       environment flag
  30.                   = 0 means under basic interpreter
  31.                   = 1 means under compiled basic not /O
  32.                   = 2 means under compiled basic with /O
  33.                   = 3 means under compiled business basic
  34.  
  35.           COUNT%  number of times to repeat the character
  36.  
  37.           CHARACTER$  character to write to screen
  38.  
  39.           ATTRIBUTE%  attribute for character
  40.  
  41.  
  42.                                           *
  43.  
  44. ;______________________________________________________________________________
  45.  
  46. ;  Normal assembly directives
  47.  
  48. CODE      SEGMENT PARA PUBLIC 'CODE'
  49.  
  50.       ASSUME  CS:CODE
  51.  
  52.       EXTRN   $PUTCPOS:FAR
  53.  
  54.       PUBLIC  YREP
  55.  
  56. ATTRIBUTE      EQU  WORD PTR [BP+6] ; address of string descriptor on stack
  57.  
  58. CHAR_COUNT      EQU  WORD PTR [BP+8] ; address of character count on stack
  59.  
  60. STRING_DESC      EQU  WORD PTR [BP+10] ; address of string descriptor on stack
  61.  
  62. ENV_FLAG      EQU  WORD PTR [BP+12] ; address of environment flag on stack
  63.  
  64. ;______________________________________________________________________________
  65.  
  66. YREP      PROC      FAR
  67.  
  68.       PUSH      BP               ; address parameters on stack
  69.       MOV      BP,SP
  70.  
  71.       PUSH      AX               ; save all registers used,
  72.       PUSH      BX
  73.       PUSH      CX
  74.       PUSH      DX
  75.       PUSH      DI
  76.       PUSH      ES
  77.  
  78.  
  79. ;      ...      0) load environment flag showing compiled or interpreted
  80.  
  81.       MOV      SI,ENV_FLAG           ; load address of environment flag
  82.       MOV      SI,WORD PTR [SI]     ; load flag itself
  83.  
  84.  
  85.  
  86. ;      ...      1) load type of crt display from 0000:463
  87.  
  88.       SUB      AX,AX              ; address system area
  89.       MOV      ES,AX
  90.  
  91.       MOV      DX,WORD PTR ES:[463h]      ; load address of display adapter
  92.       ADD      DX,6                 ; address crt status port
  93.  
  94.  
  95.  
  96. ;      ...      2) load current position from 0000:0450 if compiled
  97. ;              or from DS:[0056h] if interpreted
  98.  
  99.       CMP      SI,0               ; check environment flag
  100.       JNE      COMPILED
  101.  
  102.       MOV      CX,WORD PTR DS:[0056h]   ; load from basic space
  103.       XCHG      CL,CH            ; basic has it reversed
  104.       DEC      CL               ; basic starts count from 1
  105.       DEC      CH               ;  instead of zero
  106.       JMP      SHORT CALC_POSITION
  107.  
  108. COMPILED:
  109.       MOV      CX,WORD PTR ES:[450h]    ; load current position
  110.                        ;  from system space
  111. CALC_POSITION:
  112.       SUB      AH,AH            ; isolate row number in AX
  113.       MOV      AL,CH
  114.       MOV      BL,80            ; multiply row by 80 bytes per row
  115.       MUL      BL
  116.       SUB      CH,CH            ; add in column number
  117.       ADD      AX,CX
  118.  
  119.       MOV      DI,AX
  120.       SHL      DI,1               ; multiply by 2 to account
  121.                        ;  for attribute bytes
  122.  
  123.  
  124.  
  125. ;      ...      3) load count of characters to write
  126.  
  127.       MOV      BX,CHAR_COUNT        ; load address of character count
  128.       MOV      CX,WORD PTR DS:[BX]
  129.  
  130.  
  131. ;      ...      4) load character to write
  132. ;               note that each of the modes supported has their
  133. ;               own format for the string descriptor
  134.  
  135.       MOV      BX,STRING_DESC       ; load address of string descriptor
  136.       CMP      SI,0               ; running compiled?
  137.       JNE      IS_COMPILED
  138.       MOV      BX,WORD PTR [BX+1]   ; load offset of string
  139.       JMP      SHORT LOAD_CHAR
  140.  
  141. IS_COMPILED:
  142.       MOV      BX,WORD PTR [BX+2]   ; load offset of string
  143.  
  144.       CMP      SI,3
  145.       JNE      LOAD_CHAR
  146.  
  147.       ADD      BX,3               ;  Support BBC String format
  148.  
  149. LOAD_CHAR:
  150.  
  151.       MOV      AL,BYTE PTR [BX]     ; load the character itself
  152.  
  153.  
  154. ;      ...      4) load attribute for character
  155.  
  156.       MOV      BX,ATTRIBUTE           ; load address of attribute
  157.       MOV      BH,BYTE PTR DS:[BX]  ; load the attribute itself
  158.       MOV      BL,AL            ; move in the character
  159.  
  160.  
  161. ;      ...      5) address the screen segment
  162.  
  163.       MOV      AX,0B000h           ; screen seg for monochrome card
  164.       CMP      DX,03DAh           ; is this a graphic card?
  165.       JNE      MONOCHROME
  166.  
  167.       MOV      AX,0B800h           ; load screen seg for graphic card
  168.  
  169. MONOCHROME:
  170.  
  171.       MOV      ES,AX            ; address the screen buffer
  172.  
  173.  
  174.  
  175.  
  176. ;      ...      6) move string to screen while synchronizing
  177. ;              with horizontal retrace
  178.  
  179. DISPLAY_LOOP:
  180.  
  181.       CLI
  182. HSYNC_WAIT1:
  183.       IN      AL,DX            ; check for horizontal retrace
  184.       TEST      AL,1
  185.       JNZ      HSYNC_WAIT1           ; wait for retrace
  186. HSYNC_WAIT2:
  187.       IN      AL,DX            ; check for horizontal retrace
  188.       TEST      AL,1
  189.       JZ      HSYNC_WAIT2           ; wait for retrace
  190.  
  191.       MOV      AX,BX
  192.       STOSW                ; store character and attribute
  193.       STI
  194.  
  195.       ADD      DI,158           ; drop down one line
  196.       CMP      DI,4000
  197.       JL      NOT_OFF_BOTTOM
  198.  
  199.       SUB      DI,4000           ; start over again at top
  200. NOT_OFF_BOTTOM:
  201.  
  202.       LOOP      DISPLAY_LOOP           ; repeat cx times
  203.  
  204.       SUB      DI,158           ; remain on last line
  205.  
  206.  
  207.  
  208. ;      ...      7) update cursor position
  209.  
  210.       MOV      AX,DI            ; load current position
  211.       SHR      AX,1               ; discount attribute bytes
  212.       SUB      DX,DX            ; no sign in this division
  213.       MOV      BX,80            ; divide by nmbr of chars per row
  214.       DIV      BX
  215.       MOV      DH,AL            ; store row number
  216.                        ; column number already in DL
  217.       MOV      BH,0               ; assume page 0
  218.       MOV      AH,2               ; request new position
  219.       INT      10h
  220.  
  221.       XCHG      DH,DL            ; basic likes it reversed
  222.       INC      DL               ; basic starts count from 1
  223.       INC      DH               ;  instead of zero
  224.  
  225.       MOV      SI,ENV_FLAG           ; load address of environment flag
  226.       CMP      WORD PTR DS:[SI],0   ; examine flag
  227.       JE      NOT_COMPILED
  228.  
  229.       CMP      WORD PTR DS:[SI],3   ; business basic?
  230.       JE      RET_TO_BASIC
  231.  
  232.       CMP      WORD PTR DS:[SI],2   ; compiled with /O?
  233.       JE      WITH_SLASH_O
  234.  
  235.                                     ; FLAG = 1
  236.       MOV      WORD PTR DS:[87h],DX ; store screen address
  237.       JMP      SHORT RET_TO_BASIC
  238.  
  239.  
  240. WITH_SLASH_O:                                ; FLAG = 2
  241.       MOV      DI,SEG $PUTCPOS     ; address put cursor routine
  242.       MOV      ES,DI
  243.       MOV      DI,OFFSET $PUTCPOS
  244.       MOV      DI,WORD PTR ES:[DI+2]  ; load offset of cursor storage
  245.       MOV      WORD PTR DS:[DI],DX     ; store new cursor position
  246.       JMP      SHORT RET_TO_BASIC
  247.  
  248.  
  249. NOT_COMPILED:                                ; FLAG = 0
  250.       MOV      WORD PTR DS:[0056h],DX ; store new cursor position
  251.  
  252.  
  253. RET_TO_BASIC:                                ; FLAG = 3
  254.  
  255.  
  256.  
  257.  
  258.       POP      ES
  259.       POP      DI
  260.       POP      DX
  261.       POP      CX
  262.       POP      BX
  263.       POP      AX
  264.       POP      BP
  265.       RET      8
  266.  
  267.  
  268. YREP      ENDP
  269.  
  270. ;______________________________________________________________________________
  271.  
  272. CODE      ENDS
  273.  
  274.       END
  275.